\chapter{厂商内置库}

厂商可以添加和使用厂商内置库，以便提前加载厂商的特定设置和库函数。

\section{vendor\_builtin库}

在Tenon执行器加载和运行二进制文件时，会首先加载Tenon系统的builtin库的二进制文件，
然后查找名为vendor\_builtin的库文件，并加载。厂商可以添加这个vendor\_builtin库，
在其中包含厂商特定的库函数。

\section{Executor::setVendorBuiltinInit方法}

厂商还可以通过调用Executor::setVendorBuiltinInit方法，设定vendor\_builtin的库的初始化方法。
其原型如下：

\begin{verbatim}
    void setVendorBuiltinInit(Task* task, void(*init_func)(void*));
\end{verbatim}

其中，参数task是要使用厂商内置库的任务；参数init\_func是Tenon执行器在初始化时，
调用的厂商内置库的初始化方法的函数指针。该函数指针的类型定义如下：

\begin{verbatim}
    typedef void(*vendor_builtin_init_func_t)(ExecCtxHandle ectx);
\end{verbatim}

厂商内置库的初始化方法没有返回值，包含一个参数，其类型实际为Tenon的执行时上下文环境。

在该初始化方法中，厂商可以执行注册中断处理器类、添加C扩展函数等等操作。
可以参考Tenon内置库的初始化方法：

\begin{verbatim}
    void init_builtin(void* ctx) {
        // register irq handler classes
        tenon_register_irq_handler_class(ctx, IRQ_TIMER, nullptr, itimer_handler_release,
                                         itimer_handler_save, itimer_handler_recover);
        tenon_register_irq_handler_class(ctx, IRQ_PERS, ipers_handler_cmp, nullptr,
                                         ipers_handler_save, ipers_handler_recover);
        tenon_register_irq_handler_class(ctx, IRQ_SNAPSHOT, nullptr, nullptr, nullptr, nullptr);

        // register opaque functions
        ctx->getExecutor()->addExtFunctions("__builtin__", builtin_funcs);
    }
\end{verbatim}

\section{\_\_vendor\_builtin\_\_ 模块}

厂商的vendor\_builtin库中，还可以添加一个特定的模块\_\_vendor\_builtin\_\_，类似Tenon的内置\_\_builtin\_\_模块，
可以声明厂商的内置错误的编号、内置类型声明、内置函数等特殊代码。

厂商的内置错误应该使用1000以上的编号，1000以下的错误编号由Tenon内部使用，或者用户用于自定义错误（1到90）。
